#include<iostream>
using namespace std;

// 求幂
double pow1(double x, int n)
{
	// n为1
	if(n==1)
		return x;
	
	// n为偶数，递归
	else if(n % 2 == 0)
	{
		double f = pow1(x, n/2);
		return f*f;
	}
	
	// n为奇数，递归
	else
	{
		double f = pow1(x, n/2);
		return f*f*x;
	}
}

// 快速幂方法
double pow2(double x, int n)
{
	double ans=1.0, base=x;
	while (n!=0)
	{
		// 遇到二进制位1
		if ((n&1)==1)
			ans *= base;	// 求ans
		
		// 权递增
		base*=base;
		
		// n右移1位
		n >>= 1;	
	}
	return ans;
}

int main()
{
	// 求x的n次幂
	double x = 2.0;
	for(int n=1; n<=10; n++)
	{ 
		printf("pow1=%g,  \t", pow1(x, n));
		printf("pow2=%g\n", pow2(x, n));
	}
	return 0;
}
